As common sense suggest, Iterators
are object
which can be iterated upon such as list, dictionary, string etc. In Python
they are literally everywhere.
They are objects
which when iterated retuns one element at a time. We have already seen most of the inbuilt iterators, such as list, tuple, dictionary, string, etc. In this chapter we are going to create our own custom iterators.
There are few ways in which we can create a custom iterators.
In order to create a python iterator, our custom class must implement two special methods, __iter__()
and __next__()
, which collectively are called the iterator protocol
.
In [8]:
class MyIter(object):
def __init__(self, lst):
self.lst = lst
self.i = 0
def __iter__(self):
self.i = 0
return self
def __next__(self):
if self.i < len(self.lst):
nxt = self.lst[self.i]
self.i +=1
return nxt
else:
raise StopIteration
m = MyIter([1, 2, 3, 4, 5, 6])
for a in m:
print(a)
The iter()
method returns an iterator for the given object.
Syntax:
iter(object[, sentinel])
Where object
is an object based on which the iterator needs to be constructed. The behavior of iterator is dependent on the value of sentinel
, if sentinel
is not provided then object
should be an interator and the construct will behave as such, where as if sentinel
is provided then object
should be callable, and value returned will be treated as next
call. Iteration ends when the value retuned equals to value in sentinel
In [11]:
class MyDummy(object):
def __init__(self):
self.lst = [1, 2, 3, 4, 5, 6]
self.i = 0
def __call__(self):
ret = self.lst[self.i]
self.i += 1
return ret
d = MyDummy()
for a in iter(d, 3):
print(a, end=" ")
In [17]:
m = MyIter([1, 2, 3, 4, 5, 6])
for a in iter(m):
print(a, end=" ")
lets try another example, this time lets take a string
In [16]:
st = "Welcome to the city of lakes"
for a in iter(st):
print(a, end=" ")